package com.weyoung.app.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.weyoung.common.model.dto.app.GenerationQueryDTO;
import com.weyoung.common.model.dto.app.RelationNodeDTO;
import com.weyoung.common.model.dto.app.UpdateRelationNodeDTO;
import com.weyoung.common.model.dto.app.UpdateRelationNodeDetailDTO;
import com.weyoung.common.model.entity.FamilyRelation;
import com.weyoung.common.model.vo.app.RelationNodeDetailVO;
import com.weyoung.common.model.vo.app.RelationTreeVO;
import com.weyoung.common.model.vo.app.UserDetailVO;

import java.util.List;

/**
 * 族谱关系服务接口
 */
public interface RelationService extends IService<FamilyRelation> {

    /**
     * 获取家族中未建立族谱关系的成员
     * @param familyId 家族ID
     * @return 未建立族谱关系的成员列表
     */
    List<UserDetailVO> getUnrelatedFamilyMembers(String familyId);

    /**
     * 获取当前用户父系族谱树
     * @return 族谱树列表
     */
    List<RelationTreeVO> getRelationTree();

    /**
     * 获取母系族谱树
     * @return 母系族谱树列表
     */
    List<RelationTreeVO> getMaternalRelationTree();

    /**
     * 创建族谱节点
     * @param dto 族谱节点创建参数
     * @return 创建的族谱节点
     */
    FamilyRelation createRelationNode(RelationNodeDTO dto);

    /**
     * 更新族谱节点
     * @param dto 族谱节点更新参数
     */
    void updateRelationNode(UpdateRelationNodeDTO dto);

    /**
     * 设置配偶关系
     * @param relationId 关系ID
     * @param spouseId 配偶用户ID
     */
    void setSpouse(Long relationId, Integer spouseId);

    /**
     * 删除配偶关系
     * @param relationId 关系ID
     * @return 更新后的族谱节点
     */
    void removeSpouse(Long relationId);

    /**
     * 获取指定世代的所有节点
     * @param dto 世代查询参数
     * @return 指定世代的族谱节点列表
     */
    List<FamilyRelation> getNodesByGeneration(GenerationQueryDTO dto);

    /**
     * 获取指定节点的详细信息
     * @param userId 用户ID
     * @return 节点详细信息
     */
    RelationNodeDetailVO getRelationNodeDetail(Integer userId);

    /**
     * 更新族谱节点详细信息
     * @param dto 族谱节点详细信息更新参数
     */
    void updateRelationNodeDetail(UpdateRelationNodeDetailDTO dto);

    void deleteRelationNodeRecursive(Long relationId);
}
